package day64;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Properties;

public class Demo {

	public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
//		IDB db = new MySql();
//		db.getConnection();
//		
//		db = new Oracle();
//		db.getConnection();
		
		// 反射+配置文件,在这里不需要出现具体的子类
		// 在编译时候不知道加载的是哪个类，
		// 在运行时可以动态的获取类的属性调用对象的方法的机制就叫做反射。
		FileInputStream fileInputStream = new FileInputStream("src/day64/db.properties");
		// Java里面提供了一个类Properties专门用来帮助读取.properties配置文件
		// property:属性  
		Properties properties = new Properties();
		properties.load(fileInputStream);
		String dbName = properties.getProperty("dbName");
		System.out.println(dbName);// day64.MySql
		// 有了完整的包名+类名，通过反射就可以new出这个类的对象
		// IDB db = new MySql();
		Class clazz = Class.forName(dbName);
		// 这是简化的写法，如果new无参构造方法，
		// 可以省去得到Constructor对象步骤，直接clazz.newInstance()简化的写法
//		IDB db = (IDB)clazz.newInstance();
		
		// 得到无参构造方法
		Constructor constructor = clazz.getConstructor();
		// new MySql();
		IDB db = (IDB) constructor.newInstance();
		db.getConnection();
		
	}
}
